// 获取光标位置
// 如果节点是BODY不做任何操作
class Cursor {
    constructor(input) {
        this.input = input
        this.selection = null // 选区对象
        this.range = null // 光标对象
        this.cursor = 0
        this.__init()
    }
    __init() {
        console.log('__init')
        this.range = this.getRange()
    }
    // 将光标设置到最后
    setRangeToEnd(el) {
        if (document.selection) {
            this.range.moveToElementText(el)
            this.range.collapse(false)
            this.range.select()
        } else if (window.getSelection) {
            if(!this.range.selectAllChildren) {
                this.range = window.getSelection()
            }
            this.range.selectAllChildren(el)
            this.range.collapseToEnd()
        }
        this.getRange()
    }
    // 获取光标对象
    getRange() {
        this.selection = document.getSelection()
        if (document.selection && document.selection.createRange) {
            return document.selection.createRange()
        } else if (window.getSelection) {
            return window.getSelection()
        }
    }
    // 获取光标位置
    getCursor() {
        this.range = this.selection.getRangeAt(0)
    }
    // 在光标处插入节点
    insertElement(el) {
        if (!el) return
        let range = this.range
        if (!range.insertNode) {
            range = this.selection.getRangeAt(0)
        }
        range.insertNode(el)
        const node = range.commonAncestorContainer
        const childNodes = node.childNodes
        // 判断该插入的内容处于选区的位置
        Array.prototype.forEach.call(childNodes, (item, index) => {
            if (item === el) {
                this.__setRangeToNode(range, index + 1)
            }
        })
    }
    // 设置光标到插入元素后的位置
    __setRangeToNode(range, pos) {
        const node = range.commonAncestorContainer
        range.setStart(node, pos)
        range.setEnd(node, pos)
        range.collapse(true)
        this.selection.removeAllRanges()
        this.selection.addRange(range)
    }
    // 重置光标对象
    resetRange() {
        this.getRange()
    }
}

export default input => new Cursor(input)